package com.wbs.domain.base;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.Transient;

import org.hibernate.annotations.Parameter;
import org.hibernate.annotations.Type;
import org.joda.time.DateTime;
import org.springframework.format.annotation.DateTimeFormat;

@MappedSuperclass
public class BaseEntity implements Serializable{

    private static final long serialVersionUID = 1L;
    private Long codigo;
    private String creadoPor;
    private DateTime fechaCreacion;
    private String modificadoPor;
    private DateTime fechaModificacion;
    private boolean eliminado;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="codigo")
    public Long getCodigo() {
        return codigo;
    }

    public void setCodigo(Long codigo) {
        this.codigo = codigo;
    }

    @Column(name="creadoPor")
    public String getCreadoPor() {
        return creadoPor;
    }

    public void setCreadoPor(String creadoPor) {
        this.creadoPor = creadoPor;
    }

    @Column(name="fechaCreacion",nullable = false, updatable = false)
    @Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime",parameters = {@Parameter(name = "databaseZone", value = "jvm")})
    @DateTimeFormat(pattern = "dd/MM/yyyy")
    public DateTime getFechaCreacion() {
        return fechaCreacion;
    }

    public void setFechaCreacion(DateTime fechaCreacion) {
        this.fechaCreacion = fechaCreacion;
    }

    @Column(name="modificadoPor")
    public String getModificadoPor() {
        return modificadoPor;
    }

    public void setModificadoPor(String modificadoPor) {
        this.modificadoPor = modificadoPor;
    }

    @Column(name="fechaModificacion",nullable = false)
    @Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime", parameters = {@Parameter(name = "databaseZone", value = "jvm")})
    @DateTimeFormat(pattern = "dd/MM/yyyy")
    public DateTime  getFechaModificacion() {
        return fechaModificacion;
    }

    public void setFechaModificacion(DateTime fechaModificacion) {
        this.fechaModificacion = fechaModificacion;
    }

    @Column(name="eliminado")
    public boolean isEliminado() {
        return eliminado;
    }

    public void setEliminado(boolean eliminado) {
        this.eliminado = eliminado;
    }

    @Transient
    public boolean isNew() {
        if (codigo == null) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int code = 1;
        code = prime * code
                + ((creadoPor == null) ? 0 : creadoPor.hashCode());
        code = prime * code
                + ((fechaCreacion == null) ? 0 : fechaCreacion.hashCode());
        code = prime * code + (eliminado ? 1231 : 1237);
        code = prime * code + ((codigo == null) ? 0 : codigo.hashCode());
        code = prime * code
                + ((modificadoPor == null) ? 0 : modificadoPor.hashCode());
        code = prime
                * code
                + ((fechaModificacion == null) ? 0 : fechaModificacion.hashCode());
        return code;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        BaseEntity other = (BaseEntity) obj;
        if (creadoPor == null) {
            if (other.creadoPor != null)
                return false;
        } else if (!creadoPor.equals(other.creadoPor))
            return false;
        if (fechaCreacion == null) {
            if (other.fechaCreacion != null)
                return false;
        } else if (!fechaCreacion.equals(other.fechaCreacion))
            return false;
        if (eliminado != other.eliminado)
            return false;
        if (codigo == null) {
            if (other.codigo != null)
                return false;
        } else if (!codigo.equals(other.codigo))
            return false;
        if (modificadoPor == null) {
            if (other.modificadoPor != null)
                return false;
        } else if (!modificadoPor.equals(other.modificadoPor))
            return false;
        if (fechaModificacion == null) {
            if (other.fechaModificacion != null)
                return false;
        } else if (!fechaModificacion.equals(other.fechaModificacion))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "BaseEntity [" +
               "codigo = " + codigo +
               ", creadoPor = " + creadoPor +
               ", fechaCreacion = " + fechaCreacion +
               ", modificadoPor = " + modificadoPor +
               ", fechaModificacion = " + fechaModificacion +
               ", eliminado = " + eliminado +
               "]";
    }
}